/**
 * Universidad del Valle de Guatemala
 * CC2003 Algoritmos y Estructuras de Datos
 * Proyecto 1: Inérprete de LISP --> Lambda LISP
 * Integrantes:
 *      Julio Chicas, José García, Ernesto Rodríguez, Karen Tojín
 **/

/**
 * Descripción: Parsing de un ingreso del usuario a una lista o a realizar las operaciones indicadas
 * cuando sea el caso.
 **/

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class parser {

    public static List parse(String lista) throws Exception {

        List objs = new LinkedList();
        int cont = 0;
        Scanner scn = new Scanner(lista);

        String cache;

        if (!scn.next().equals("(")) {
            throw new Exception();
        }
        do {

            cache = scn.next();

            if (!cache.equals(")")) {

                if (cache.equals("(")) {
                    cont++;
                    String tmp = "( ";

                    do {
                        tmp = scn.next();
                        if (tmp.equals("(")) {
                            cont++;
                        }
                        if (tmp.equals(")")) {
                            cont--;
                        }
                        cache = cache + " " + tmp;
                    } while (!tmp.equals(")") || cont != 0);

                    objs.add(parse(cache));

                    //objs.add(parse(cache));

                } else {

                    objs.add(cache);
                }
            }
        } while (!cache.equals(")"));

        return objs;

    }

    public static LinkedList<LinkedList> parseOper(String lista) throws Exception {

        LinkedList<LinkedList> objs = new LinkedList<LinkedList>();
        int cont = 0;
        Scanner scn = new Scanner(lista);

        String cache;

        if (!scn.next().equals("(")) {
            throw new Exception();
        }
        do {

            cache = scn.next();

            if (!cache.equals(")")) {

                if (cache.equals("(")) {
                    cont++;
                    String tmp = "( ";

                    do {
                        tmp = scn.next();
                        if (tmp.equals("(")) {
                            cont++;
                        }
                        if (tmp.equals(")")) {
                            cont--;
                        }
                        cache = cache + " " + tmp;
                    } while (!tmp.equals(")") || cont != 0);

                    objs.add(parseOper(cache));

                    //objs.add(parse(cache));

                } else {
                    LinkedList preobj = new LinkedList();
                    try {
                        preobj.add(new Integer(Integer.parseInt(cache)));

                        objs.add(preobj);
                    } catch (NumberFormatException e) {
                        throw new Exception();
                    }
                }
            }
        } while (!cache.equals(")"));

        return objs;

    }
}

